package com.woniuxy.flowable.service;


import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * Flowable工作流服务接口
 * @author woniuxy
 */
public interface FlowAbleService {
    
    /**
     * 启动流程
     * @param XMLPath XML路径
     * @param flowName 流程名称
     * @param info 流程信息
     * @param rolesDto 角色信息
     * @param conditions 流程条件
     * @return 流程实例ID
     */
    String startFlowAble(String XMLPath, String flowName, Map<String, Object> info, Object rolesDto, Map<String, Object> conditions);
    
    /**
     * 通过流程定义Key启动流程实例
     * @param processDefinitionKey 流程定义Key
     * @param businessKey 业务Key
     * @param variables 流程变量
     * @return 流程实例
     */
    org.flowable.engine.runtime.ProcessInstance startProcessInstanceByKey(String processDefinitionKey, String businessKey, Map<String, Object> variables);
    
    /**
     * 查询用户待办任务（包含直接分配和候选任务）
     * @param userName 用户名
     * @return 待办任务列表
     */
    List<Map<String, Object>> queryUserFlow(String userName);
    
    /**
     * 查询用户已办任务
     * @param userName 用户名
     * @return 已办任务列表
     */
    List<Map<String, Object>> queryCompletedTasks(String userName) throws ParseException;
    
    /**
     * 通过审批
     * @param taskId 任务ID
     */
    void acceptFlow(String taskId);
    
    /**
     * 拒绝审批
     * @param taskId 任务ID
     * @param reason 拒绝原因
     */
    void rejectFlow(String taskId, String reason);
    
    /**
     * 自定义完成任务
     * @param taskId 任务ID
     * @param variables 流程变量
     */
    void completeFlow(String taskId, Map<String, Object> variables);
    
    /**
     * 获取当前审批人
     * @param deploymentId 部署ID或流程实例ID
     * @return 审批人列表
     */
    List<String> getLocalOperator(String deploymentId);
    
    /**
     * 测试动态审批功能
     * @return 测试结果
     */
    String testDynamicApproval();
    
    /**
     * 添加用户到地区经理组
     * @param userName 用户名
     */
    void addUserToDistrictManagerGroup(String userName);
    
    /**
     * 从地区经理组移除用户
     * @param userName 用户名
     */
    void removeUserFromDistrictManagerGroup(String userName);
    
    /**
     * 检查用户是否有地区经理权限
     * @param userName 用户名
     * @return 是否有权限
     */
    boolean hasDistrictManagerPermission(String userName);
    
    /**
     * 同步用户到Flowable
     * @param username 用户名
     * @param realName 真实姓名
     * @param email 邮箱
     * @param groupId 组ID
     * @return 同步结果
     */
    String syncUserToFlowable(String username, String realName, String email, String groupId);
    
    /**
     * 直接推进流程到下一个节点
     * @param taskId 任务ID
     */
    void advanceProcessToNextStep(String taskId);
    
    /**
     * 获取用户审批历史记录
     * @param params 查询参数
     * @return 审批历史记录
     */
    Map<String, Object> getApprovalHistory(Map<String, Object> params);
    
    /**
     * 获取用户审批统计信息
     * @param userName 用户名
     * @return 统计信息
     */
    Map<String, Object> getApprovalStatistics(String userName);

    /**
     * 获取流程步骤
     * @param processInstanceId 流程实例ID
     * @return 流程步骤列表
     */
    List<Map<String, Object>> getProcessSteps(String processInstanceId);

    /**
     * 查询流程状态
     * @param processInstanceId 流程实例ID
     * @return 流程状态信息
     */
    Map<String, Object> getProcessStatus(String processInstanceId);
}

